package main

import "fmt"

type Dog struct {
	Name string
}

type IDog interface {
	Bark()
}

func (d *Dog) Bark() {
}

func NilDogPtr() *Dog {
	return nil
}
func NilIDog() IDog {
	return nil
}
func NilIDogPtr() *IDog {
	var p *IDog

	return p
}
func NilIDogPtr2() *IDog {
	var p *IDog
	return p
}

func main() {
	dogPtr := NilDogPtr()
	iDog := NilIDog()
	iDogPtr := NilIDogPtr()
	iDogPtr2 := NilIDogPtr2()
	if dogPtr == nil {
		fmt.Println("dog is nil")
	}
	if iDog == nil {
		fmt.Println("iDog is nil")
	}
	if iDogPtr == nil {
		fmt.Println("iDogPtr is nil")
	}
	if iDogPtr2 == nil {
		fmt.Println("iDogPtr2 is nil")
	}

	fmt.Println("--------------------")
	var inter IDog
	//inter = iDog
	inter = NilDogPtr()
	fmt.Println(inter == nil) //false

	fmt.Println("--------------------")

	inter = nil
	fmt.Println(inter == nil) //true

}
